/* 
 * File:   Indexador.c
 * Author: Vitor
 *
 * Created on 5 de Setembro de 2012, 15:56
 */
#include "Indexador.h"

void gera_index(char *nomeArquivo)
{
    int exiExt;
    char nomeArq[100], exten[] = EXTENTAB;
    char tipoAbert[4] = "r";
    FILE *index = NULL, *table = NULL;

    strcpy(nomeArq, nomeArquivo);

    //Abrindo o Arquivo CSV
    exiExt = existeExten(nomeArquivo);
    if (exiExt == 0)
    {
        colocaExten(nomeArq, exten);
        table = abreArquivo(nomeArq, tipoAbert);
        if (table == NULL)
        {
            printf("Erro de Arquivos");
            exit(1);
        }
    }
    else
    {
        table = abreArquivo(nomeArq, tipoAbert);
        if (table == NULL)
        {
            printf("Erro de Arquivos");
            exit(1);
        }
    }


    //Abrindo o Arquivo IDX
    strcpy(exten, EXTENIDX);
    strcpy(tipoAbert, "w+");

    removeExten(nomeArq);
    colocaExten(nomeArq, exten);

    index = abreArquivo(nomeArq, tipoAbert);
    if (index == NULL)
    {
        printf("Erro de Arquivos");
        exit(1);
    }

    //gerando o Index
    engine_index(table, index);

    //Fechando os Arquivos
    fclose(index);
    fclose(table);

    //Ordenado o Index
    ordenaIndex(nomeArq);
}

void engine_index(FILE* table, FILE* index)
{

    int prr = 0, i = 0;
    char lixo, nome[100];

    /*Cria o arquivo de indices com o tamanho do registro*/
    while (1)
    {
        //pegando o nome
        i = -1;
        do
        {
            i++;
            fscanf(table, "%c", &nome[i]);

            if (feof(table))
                break;
        }
        while (nome[i] != ';');
        if (feof(table))
            break;
        nome[i] = '\0';

        //gravando no index
        fprintf(index, "%s;%d\n", nome, prr);

        prr += i + 1;

        do
        {
            fscanf(table, "%c", &lixo);
            prr++;
        }
        while (lixo != '\n');
        prr++;

    }

}

int existeExten(char* nome)
{
    int i, k;

    for (i = 0, k = 0; nome[i] != '\0'; i++)
        if (nome[i] == '.')
            k++;

    return k;
}

void removeExten(char* nome)
{
    int i, k;

    for (i = 0, k = 0; nome[i] != '\0'; i++)
        if (nome[i] == '.')
            k = i;

    nome[k] = '\0';
}

void colocaExten(char* nome, char *exten)
{
    int i, k;

    for (i = 0, k = 0; exten[k] != '\0'; i++)
        if (nome[i] == '\0' || k != 0)
        {
            nome[i] = exten[k];
            k++;
        }

    nome[i] = '\0';
}

FILE* abreArquivo(char *nomeArquivo, char *tipoAbertura)
{
    FILE *arqui = NULL;
    arqui = fopen(nomeArquivo, tipoAbertura);
    return arqui;
}

void ordenaIndex(char* nome)
{
    FILE *index = NULL;
    int control = 1000000, i = 0, firstPass = 0;
    int organ = 1;
    char nome1[200], nome2[100], abre[] = "r+", lixo;
    int pulo = 0;

    index = abreArquivo(nome, abre);
    if (index == NULL)
    {
        printf("Erro de Arquivo");
        exit(1);
    }

    while (i < control && organ != 0)
    {
        organ = 0;
        rewind(index);

        while (!feof(index))
        {
            //pegando strings
            fscanf(index, "%[^\n]", nome1);
            if (feof(index))
                break;

            fscanf(index, "%c", &lixo);
            if (feof(index))
                break;

            fscanf(index, "%[^\n]", nome2);
            if (feof(index))
                break;

            //verificando se e necessaria a troca
            if (compara(nome1, nome2) > 0)
            {
                //trocando de posicao
                pulo = strlen(nome1) + strlen(nome2) + 2;
                fseek(index, -pulo, SEEK_CUR);

                fprintf(index, "%s\n%s", nome2, nome1);
                fseek(index, -strlen(nome1), SEEK_CUR);

                //fazendo controles
                organ++;
            }
            else
            {
                fseek(index, -strlen(nome2), SEEK_CUR);
            }

            if (firstPass == 0)
                control++;
        }
        if (firstPass == 0)
            control -= 1000000 - 1;
        firstPass++;
        
        i++;
    }

    fclose(index);
}

int compara(unsigned char* nome1,unsigned char* nome2)
{
    int diff = 0, i = 0;
    
    while (diff == 0 && nome1[i] != '\0' && nome2[i] != '\0')
    {
        diff += (int)(nome1[i]) - (int)(nome2[i]);
        i++;
    }
    return diff;
}
